﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using SIGERP_Entidades;

namespace SIGERP_Datos
{
    public class HndDepartamento
    {



        public static List<Departamento> getAll()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.departamento ORDER BY id_area");
            var departamentos = new List<Departamento>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Departamento d = new Departamento(dtRow);
                d.area = HndArea.getOne(Convert.ToInt32(dtRow["id_area"]));
                departamentos.Add(d);
            }
            return departamentos;
        }

        public static Departamento getOne(int id)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.departamento WHERE id_departamento=" + id);
            DataRow dtRow = tabla.Rows[0];
            Departamento d = new Departamento(dtRow);
            d.area = HndArea.getOne(Convert.ToInt32(dtRow["id_area"]));
            return d;
        }

        public static Boolean insert(Departamento departamento)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "INSERT INTO dbo.departamento (descripcion,habilitado,id_area) VALUES (@descripcion,1,@id_area)";
            comando.Parameters.AddWithValue("@descripcion", departamento.descripcion);
            comando.Parameters.AddWithValue("@id_area", departamento.area.id);
            return Conexion.ejecutaComando(comando);
        }

        public static Boolean update(Departamento departamento)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.departamento SET descripcion=@descripcion,habilitado=@habilitado,id_area=@id_area WHERE id_departamento=@id";
            comando.Parameters.AddWithValue("@descripcion", departamento.descripcion);
            if (departamento.habilitado) comando.Parameters.AddWithValue("@habilitado", 1);
            else comando.Parameters.AddWithValue("@habilitado", 0);
            comando.Parameters.AddWithValue("@id_area", departamento.area.id);
            comando.Parameters.AddWithValue("@id", departamento.id);

            return Conexion.ejecutaComando(comando);
        }

        public static Boolean delete(Departamento departamento)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "DELETE FROM dbo.departamento WHERE id_departamento=@id";
            comando.Parameters.AddWithValue("@id", departamento.id);
            return Conexion.ejecutaComando(comando);
        }

        public static List<Departamento> getAllEnabled()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.departamento WHERE habilitado=1 ORDER BY id_area");
            var departamentos = new List<Departamento>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Departamento d = new Departamento(dtRow);
                d.area = HndArea.getOne(Convert.ToInt32(dtRow["id_area"]));
                departamentos.Add(d);
            }
            return departamentos;
        }

        public static List<Departamento> getAllWhereUser(Usuario user)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT d.* FROM dbo.departamento AS d INNER JOIN usuario_departamento AS ud ON d.id_departamento=ud.id_departamento WHERE habilitado=1 AND ud.id_usuario=" + user.id);
            var departamentos = new List<Departamento>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Departamento d = new Departamento(dtRow);
                d.area = HndArea.getOne(Convert.ToInt32(dtRow["id_area"]));
                departamentos.Add(d);
            }
            return departamentos;
        }

        public static List<Departamento> getAllWhereUserArea(Usuario user,Area a)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT d.* FROM dbo.departamento AS d INNER JOIN usuario_departamento AS ud ON d.id_departamento=ud.id_departamento WHERE habilitado=1 AND id_area=" + a.id+ " AND ud.id_usuario=" + user.id);
            var departamentos = new List<Departamento>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Departamento d = new Departamento(dtRow);
                d.area = HndArea.getOne(Convert.ToInt32(dtRow["id_area"]));
                departamentos.Add(d);
            }
            return departamentos;
        }

        public static List<Departamento> getAllWhereArea(Area a)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.departamento WHERE habilitado=1 AND id_area=" + a.id);
            var departamentos = new List<Departamento>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Departamento d = new Departamento(dtRow);
                d.area = a;
                departamentos.Add(d);
            }
            return departamentos;
        }


        public static bool verificarSiExiste(Departamento dto)
        {
            //System.Diagnostics.Debug.Write("SELECT COUNT(*) FROM dbo.departamento WHERE descripcion='" + dto.descripcion + "' and id_area= " + dto.area.id);
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.departamento WHERE descripcion='" + dto.descripcion + "' and id_area= " + dto.area.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;
                        
        }

        public static bool hayUsuariosAsociados(Departamento dto)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.usuario_departamento WHERE id_departamento=" + dto.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }

        public static bool hayReclamosAsociados(Departamento dto)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.reclamo WHERE id_departamento_actual=" + dto.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }

        public static bool hayDerivacionesAsociadas(Departamento dto)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.derivacion WHERE id_departamento_destino=" + dto.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }

        public static bool hayIntervencionesAsociadas(Departamento dto)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.intervencion WHERE id_departamento=" + dto.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }
        public static bool haySubtiposAsociados(Departamento dto)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.subtipo_reclamo WHERE id_departamento_inicial=" + dto.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }

        public static Boolean disable(Departamento departamento)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.departamento SET habilitado=0 WHERE id_departamento=@id";
            comando.Parameters.AddWithValue("@id", departamento.id);

            return Conexion.ejecutaComando(comando);
        }
    }
}
